import { Service } from 'egg'

type UserInfo = {
  user_name: string
  password: string
}

type PageOption = {
  page?: number
  pageSize?: number
}

/**
 * User Service
 */
export default class User extends Service {
  // 查找所有用户列表
  public async findUsers() {
    const users = await this.ctx.model.User.findAll()
    return users
  }

  // 增加一条用户信息
  public async addUser(userInfo: UserInfo) {
    // 旧的代码
    // const res = await this.ctx.model.User.create(userInfo)
    // return res
    // 判断有再添加
    const res = await this.ctx.model.User.findCreateFind({
      defaults: userInfo, // 需要创建的用户数据
      where: {
        user_name: userInfo.user_name, // 判断用户是否存在
      },
    })
    return res
  }

  // 修改用户信息
  public async updataUser(userInfo: { oldName?: string; newName: string }) {
    const oldName = userInfo.oldName
    const res = await this.ctx.model.User.update(
      {
        user_name: userInfo.newName,
      },
      {
        where: {
          // where代表查询条件  这里oldName是buding3 标识要将buding3的这条数据修改成最新的用户信息
          user_name: oldName,
        },
      },
    )
    return res
  }
  // 删除用户信息
  public async delUser(id: number) {
    const res = await this.ctx.model.User.destroy({
      where: {
        // where代表查询条件  这里oldName是buding3 标识要将buding3的这条数据修改成最新的用户信息
        id,
      },
    })
    return res
  }
  // 批量添加
  public async bulkCreate(users: UserInfo[]) {
    const res = await this.ctx.model.User.bulkCreate(users)
    return res
  }
  // 分页获取用户信息
  public async getUserPage(option: PageOption) {
    const { page = 1, pageSize = 10 } = option || {}
    const { ctx } = this
    // ctx.model.User.findCreateFind
    const datas = await ctx.model.User.findAndCountAll<any>({
      attributes: { exclude: ['createdAt', 'updatedAt', 'password'] }, // 这里的意思是不返回哪些字段，填上后呢，就不会返回用户的密码
      order: [['id', 'DESC']], // 排序 ASC 升序    DESC降序
      //  where: {}, // 更复杂的查询条件可以看官网文档，比如可以查用户名是某某开头，包含某某字段等
      limit: pageSize, // 一页多少条数据
      offset: (page - 1) * pageSize, // 从哪个下标开始查询，就是当前页数了
    })
    return datas
  }
}
